package com.jlb.demo;

import com.jlb.demo.entity.Order;
import com.jlb.demo.entity.Product;
import com.jlb.demo.entity.User;
import com.jlb.demo.exception.BusinessException;
import com.jlb.demo.payment.AlipayPayment;
import com.jlb.demo.payment.BankCardPayment;
import com.jlb.demo.payment.Payment;
import com.jlb.demo.payment.WeChatPayment;
import com.jlb.demo.service.OrderService;
import com.jlb.demo.util.DBUtil;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * Java后端开发演示主类
 * 演示Java语言基础在后端开发中的应用
 */
public class JavaBackendDemo {
    
    public static void main(String[] args) {
        System.out.println("🚀 Java后端开发演示开始！");
        System.out.println("=".repeat(50));
        
        // 1. 基础语法演示
        demonstrateBasicSyntax();
        
//        // 2. 面向对象演示
//        demonstrateOOP();
//
//        // 3. 异常处理演示
//        demonstrateExceptionHandling();
//
//        // 4. 集合框架演示
//        demonstrateCollections();
//
//        // 5. 多态演示
//        demonstratePolymorphism();
//
//        // 6. 业务逻辑演示
//        demonstrateBusinessLogic();
//

//
//        System.out.println("=".repeat(50));
//        System.out.println("🎉 Java后端开发演示结束！");
    }
    
    /**
     * 1. 基础语法演示
     */
    private static void demonstrateBasicSyntax() {
        System.out.println("\n📚 1. Java基础语法演示");
        System.out.println("-".repeat(30));

        // 基础类型：值独立
        int a = 10;
        int b = a;
        b = 20;
        System.out.println(a); // 还是10，不受b影响

        // 引用类型：共享对象
        StringBuilder sb1 = new StringBuilder("Hello");
        StringBuilder sb2 = sb1;
        sb2.append("World");
        System.out.println(sb1); // 变成HelloWorld，因为指向同一个对象


        // 变量和数据类型
        System.out.println("1.1 变量和数据类型：");
        Long userId = 1001L;         // 用户ID，用L表示long类型
        String userName = "张三";     // 用户名
        Integer userAge = 25;        // 年龄
        Double userBalance = 100.5D; // 余额，用D表示double类型
        Boolean isVip = true;        // 是否VIP
        LocalDateTime loginTime = LocalDateTime.now(); // 当前登录时间
        
        System.out.println("用户ID: " + userId);
        System.out.println("用户名: " + userName);
        System.out.println("年龄: " + userAge);
        System.out.println("余额: " + userBalance);
        System.out.println("是否VIP: " + isVip);
        System.out.println("登录时间: " + loginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        
        // 字符串比较演示
        System.out.println("\n1.2 字符串比较演示：");
        String name1 = "张三";
        String name2 = new String("张三");
        System.out.println("name1.equals(name2): " + name1.equals(name2)); // true（内容相等）
        System.out.println("name1 == name2: " + (name1 == name2));         // false（地址不同）
        
        // 控制流程演示
        System.out.println("\n1.3 控制流程演示：");
        // if-else演示
        Double orderAmount = 200.0;
        if (isVip) {
            orderAmount *= 0.9; // VIP打9折
            System.out.println("VIP用户，订单金额打9折：" + orderAmount);
        } else {
            System.out.println("普通用户，订单金额：" + orderAmount);
        }
        
        // switch演示
        String orderStatus = "待支付";
        switch (orderStatus) {
            case "待支付":
                System.out.println("订单状态：待支付 - 提醒用户支付");
                break;
            case "已支付":
                System.out.println("订单状态：已支付 - 通知商家备餐");
                break;
            case "已发货":
                System.out.println("订单状态：已发货 - 提醒用户查收");
                break;
            default:
                System.out.println("订单状态：无效状态");
        }
        
        // 循环演示
        System.out.println("\n1.4 循环演示：");
        List<Double> orderAmounts = Arrays.asList(100.5, 200.0, 150.8);
        Double total = 0.0;
        for (Double amount : orderAmounts) {
            total += amount;
        }
        System.out.println("订单金额列表：" + orderAmounts);
        System.out.println("总金额：" + total);
    }
    
    /**
     * 2. 面向对象演示
     */
    private static void demonstrateOOP() {
        System.out.println("\n📚 2. 面向对象演示");
        System.out.println("-".repeat(30));
        
        // 创建用户对象
        System.out.println("2.1 创建用户对象（封装演示）：");
        User zhangsan = new User(1001L, "张三", 25);
        System.out.println("用户信息：" + zhangsan.getSummary());
        
        // 封装演示
        System.out.println("\n2.2 封装演示（通过方法访问私有属性）：");
        zhangsan.recharge(100.0);  // 充值100元
        zhangsan.consume(30.0);    // 消费30元
        System.out.println("当前用户信息：" + zhangsan.getSummary());
        
        // 继承演示
        System.out.println("\n2.3 继承演示（User继承BaseEntity）：");
        System.out.println("用户ID：" + zhangsan.getId());
        System.out.println("创建时间：" + zhangsan.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        
        // 创建订单对象
        System.out.println("\n2.4 创建订单对象：");
        Order order = new Order(2001L, 1001L, 150.0, "购买商品A");
        System.out.println("订单信息：" + order.getSummary());
        
        // 业务逻辑演示
        System.out.println("\n2.5 业务逻辑演示：");
        order.pay("微信支付");
        order.updateStatus("已发货");
        order.updateStatus("已完成");
    }
    
    /**
     * 3. 异常处理演示
     */
    private static void demonstrateExceptionHandling() {
        System.out.println("\n📚 3. 异常处理演示");
        System.out.println("-".repeat(30));
        
        // 数据库连接异常处理演示
        System.out.println("3.1 数据库连接异常处理演示：");
        DBUtil.testConnection();
        
        // 业务异常演示
        System.out.println("\n3.2 业务异常演示：");
        User user = new User(1002L, "李四", 16); // 未成年用户
        
        try {
            // 尝试充值负数金额
            user.recharge(-50.0);
        } catch (IllegalArgumentException e) {
            System.err.println("捕获到参数异常：" + e.getMessage());
        }
        
        try {
            // 尝试消费超过余额的金额
            user.recharge(100.0);
            user.consume(200.0);
        } catch (IllegalStateException e) {
            System.err.println("捕获到状态异常：" + e.getMessage());
        }
        
        // 自定义业务异常演示
        System.out.println("\n3.3 自定义业务异常演示：");
        OrderService orderService = new OrderService();
        
        try {
            // 尝试为不存在的用户创建订单
            orderService.createOrder(9999L, 100.0, "测试订单");
        } catch (BusinessException e) {
            System.err.println("捕获到业务异常：" + e.getFullMessage());
        }
    }
    
    /**
     * 4. 集合框架演示
     */
    private static void demonstrateCollections() {
        System.out.println("\n📚 4. 集合框架演示");
        System.out.println("-".repeat(30));
        
        // List演示
        System.out.println("4.1 List集合演示：");
        List<User> userList = new ArrayList<>();
        userList.add(new User(1001L, "张三", 25));
        userList.add(new User(1002L, "李四", 28));
        userList.add(new User(1003L, "王五", 22));
        
        System.out.println("用户列表：");
        for (User user : userList) {
            System.out.println("  " + user.getSummary());
        }
        
        // Map演示
        System.out.println("\n4.2 Map集合演示：");
        Map<Long, User> userMap = new HashMap<>();
        for (User user : userList) {
            userMap.put(user.getId(), user);
        }
        
        System.out.println("根据ID查询用户：");
        User foundUser = userMap.get(1001L);
        if (foundUser != null) {
            System.out.println("  找到用户：" + foundUser.getSummary());
        }
        
        // Set演示
        System.out.println("\n4.3 Set集合演示（去重）：");
        Set<String> phoneNumbers = new HashSet<>();
        phoneNumbers.add("13800138000");
        phoneNumbers.add("13800138001");
        phoneNumbers.add("13800138000"); // 重复号码
        phoneNumbers.add("13800138002");
        
        System.out.println("手机号集合（自动去重）：" + phoneNumbers);
    }
    
    /**
     * 5. 多态演示
     */
    private static void demonstratePolymorphism() {
        System.out.println("\n📚 5. 多态演示");
        System.out.println("-".repeat(30));
        
        // 创建不同的支付方式
        Payment weChatPay = new WeChatPayment();
        Payment alipay = new AlipayPayment();
        Payment bankCard = new BankCardPayment("工商银行");
        
        // 创建订单服务
        OrderService orderService = new OrderService();
        
        // 添加用户
        User user = new User(1001L, "张三", 25);
        user.recharge(500.0);
        user.upgradeToVip();
        orderService.addUser(user);
        
        // 创建订单
        Order order = orderService.createOrder(1001L, 200.0, "购买商品B");
        
        // 多态演示：使用不同的支付方式
        System.out.println("5.1 微信支付演示：");
        orderService.payOrder(order.getId(), weChatPay);
        
        System.out.println("\n5.2 支付宝支付演示：");
        Order order2 = orderService.createOrder(1001L, 150.0, "购买商品C");
        orderService.payOrder(order2.getId(), alipay);
        
        System.out.println("\n5.3 银行卡支付演示：");
        Order order3 = orderService.createOrder(1001L, 300.0, "购买商品D");
        orderService.payOrder(order3.getId(), bankCard);
    }
    
    /**
     * 6. 业务逻辑演示
     */
    private static void demonstrateBusinessLogic() {
        System.out.println("\n📚 6. 业务逻辑演示");
        System.out.println("-".repeat(30));
        
        OrderService orderService = new OrderService();
        
        // 创建多个用户
        User user1 = new User(1001L, "张三", 25);
        User user2 = new User(1002L, "李四", 16); // 未成年
        User user3 = new User(1003L, "王五", 30);
        
        user1.recharge(1000.0);
        user1.upgradeToVip();
        user3.recharge(500.0);
        
        orderService.addUser(user1);
        orderService.addUser(user2);
        orderService.addUser(user3);
        
        // 创建多个订单
        Order order1 = orderService.createOrder(1001L, 200.0, "VIP用户订单");
        Order order2 = orderService.createOrder(1003L, 150.0, "普通用户订单");
        
        // 尝试为未成年用户创建订单
        try {
            orderService.createOrder(1002L, 100.0, "未成年用户订单");
        } catch (BusinessException e) {
            System.err.println("业务异常：" + e.getFullMessage());
        }
        
        // 支付订单
        Payment alipay = new AlipayPayment();
        orderService.payOrder(order1.getId(), alipay);
        
        // 创建新订单用于演示
        Order order3 = orderService.createOrder(1003L, 150.0, "普通用户订单2");
        orderService.payOrder(order3.getId(), alipay);
        
        // 查询用户订单
        System.out.println("\n用户1001的订单：");
        List<Order> userOrders = orderService.getUserOrders(1001L);
        for (Order order : userOrders) {
            System.out.println("  " + order.getSummary());
        }
    }
    

} 